ÙOU CAN DO IT ON THE SCREEN, HOW ABOUT BORDERS ? ÂECAUSE YOU CANNOT GET CHARACTERS TO THE BORDER, YOU MIGHT THINK THAT IT IS IMPOSSIBLE TO MAKE A TECH-TECH EFFECT IN THE BORDERS. ÉT TAKES SO MUCH TIME TO CHANGE SPRITE X-COORDINATES, THAT YOU CAN CHANGE ONLY SOME OF THEM. ÔHERE IS TIME FOR FIVE SPRITE MOVES, IF YOU DO NOT NEED TO CHANGE THE MOST SIGNIFICANT (9TH) BIT OF THE X-COORDINATE. ÏN THE OTHER HAND, YOU COULD DESIGN THE MOVEMENTS DIRECTLY TO THE SPRITES AND THEN JUST CHANGE THE IMAGES, BUT THEN THE MOVEMENTS WOULD BE CONSTANT. ÈOWEVER, THERE IS ONE TRICK YOU CAN USE TO GET ALL OF THE SPRITES ON THE SCREEN, WITH VARIABLE MOVEMENTS AND COLOR BARS ETC. ÙOU DO NOT CHANGE THE X-COORDINATES, BUT THE DATA ITSELF ON EACH SCAN LINE. ÉN FACT YOU CHANGE THE SPRITE IMAGE POINTERS. ÔHERE IS MULTIPLE SPRITE PICTURES, WHERE THE GRAPHICS IS SHIFTED HORIZONTALLY, JUST LIKE THE NORMAL TECH-TECH CHARSETS. ÂECAUSE OF THIS, THE SPRITES HAVE TO BE PLACED SIDE BY SIDE. ÎO GAPS ARE ALLOWED. ÂY CHANGING THE IMAGE POINTERS YOU CAN GET THE GRAPHICS TO MOVE HORIZONTALLY ON EACH LINE AS YOU WISH. ×ITH MULTICOLOR SPRITES YOU HAVE TO REMEMBER THAT ONE PIXEL CORRESPONDS TO TWO BITS - THE MOVEMENT IS NOT SO SMOOTH. ×AIT ! ÈOW COME THERE IS ENOUGH TIME TO CHANGE THE SPRITE POINTERS, WHEN THERE IS NOT TIME TO CHANGE THE COORDINATES ? ÔHIS IS ANOTHER POINTER TRICK. ÖÉà READS THE SPRITE IMAGE POINTERS FROM THE END OF THE CURRENT VIDEO MATRIX, NORMALLY $07F8. ÙOU JUST HAVE TO CHANGE THE VIDEO MATRIX POINTER ($Ä018) TO CHANGE ALL OF THE IMAGE POINTERS. ÔHIS TAKES ONLY EIGHT CYCLES AND THERE IS PLENTY OF TIME LEFT FOR OTHER EFFECTS ON EACH SCAN LINE. ÉF YOU USE ONLY ONE VIDEO BANK, YOU CAN GET THE SPRITE PICTURE TO 16 DIFFERENT PLACES. ÔHIS ALLOWS ALSO ANOTHER KIND OF EFFECTS, JUST USE YOUR IMAGINATION. -------------------------------------------------------------------------- ÔECH-TECH DEMO PROGRAM (ÐÁÌ) ÂÁÎË= $96 ; ÔHE VALUE OF THE VIDEO BANK REGISTER (ÃÉÁ2) IN THE TECH-AREA ÚÐ= $Æ ; ÚERO PAGE FOR INDIRECT ADDRESSING ÓÔÁÒÔ= $4400 ; ÓTART OF THE CHARSETS (WE USE INVERTED CHARS) ÓÃÒÅÅÎ= $4000 ; ÐOSITION OF THE VIDEO MATRIX ÓÈÉÆÔÌ= $ÃÆ00 ; X-SHIFT, LOWEST 3 BITS ÓÈÉÆÔÈ= $ÃÅ00 ; X-SHIFT, HIGHEST 3 BITTID (MULTIPLIED WITH TWO) ÐÏÉÎÔÅÒ= $033à ; ÐOINTER TO SHIFT-TABLE ÖÁÌÕÅ= $033Ä ; ÓHIFT NOW ÓÐÅÅÄ= $033Å ; ÓHIFT CHANGE *= $Ã000 ; ÓTART ADDRESS.. ÉÎÉÔ ÓÅÉ ; ÄISABLE INTERRUPTS ÌÄÁ #$7Æ ÓÔÁ $ÄÃ0Ä ; ÄISABLE TIMER INTERRUPT ÌÄÁ #$81 ÓÔÁ $Ä01Á ; ÅNABLE RASTER INTERRUPT ÌÄÁ #<ÉÒÑ ÓÔÁ $0314 ; ÏUR OWN INTERRUPT HANDLER ÌÄÁ #>ÉÒÑ ÓÔÁ $0315 ÌÄÁ #49 ; ÔHE INTERRUPT TO THE LINE BEFORE THE FIRST BAD LINE ÓÔÁ $Ä012 ÌÄÁ #$1 ÓÔÁ $Ä011 ; 9TH BIT OF THE RASTER COMPARE ÌÄÙ #0 ÌÄØ #$40 ÓÔØ ÚÐ+1 ÓÔÙ ÚÐ ÔÙÁ ÌÏÏÐ0 ÓÔÁ (ÚÐ),Ù ; ÃLEAR THE WHOLE VIDEO BANK ($4000-7ÆÆÆ) ÉÎÙ ÂÎÅ ÌÏÏÐ0 ÉÎà ÚÐ+1 ÂÐÌ ÌÏÏÐ0 ÌÄÁ #>ÓÔÁÒÔ ÓÔÁ ÚÐ+1 ÌÄÁ #$32 ; ÃHARACTER ÒÏÍ TO ADDRESS SPACE ($Ä000-) ÓÔÁ $01 ÌÏÏÐ1 ÔÙÁ ; (Ù-REGISTER IS ZERO INITIALLY) ÌÓÒ ÌÓÒ ÌÓÒ ÔÁØ ÌÄÁ ÔÅØÔ,Ø ; ×HICH CHAR TO PLOT ? ÁÓÌ ; ÓOURCE ÁÓÌ ÁÓÌ ÔÁØ ; LOW BYTE TO Ø ÌÄÁ #$Ä0 ÁÄà #0 ; HIGH BYTE (ONE BIT) TAKEN INTO ACCOUNT ÓÔÁ ÌÏÏÐ2+2 ; ÓELF-MODIFYING AGAIN.. ÌÏÏÐ2 ÌÄÁ $Ä000,Ø ÓÔÁ (ÚÐ),Ù ÉÎØ ÉÎÙ ÔØÁ ÁÎÄ #7 ÂÎÅ ÌÏÏÐ2 ; ÃOPY ONE CHAR ÃÐÙ #0 ÂÎÅ ÌÏÏÐ1 ; ÃOPY 32 CHARS (256 BYTES) ÌÄÁ #$37 ; ÍEMORY CONFIGURATION BACK TO NORMAL ÓÔÁ $01 ÌÏÏÐ3 ÌÄÁ ÓÔÁÒÔ,Ù ; ÃOPY THE DATA TO EACH CHARSET, SHIFTED BY ONE ÓÔÁ ÓÔÁÒÔ+2056,Ù ; POSITION TO THE RIGHT ÓÔÁ ÓÔÁÒÔ+4112,Ù ÓÔÁ ÓÔÁÒÔ+6168,Ù ÓÔÁ ÓÔÁÒÔ+8224,Ù ÓÔÁ ÓÔÁÒÔ+10280,Ù ÓÔÁ ÓÔÁÒÔ+12336,Ù ÓÔÁ ÓÔÁÒÔ+14392,Ù ÉÎÙ ÂÎÅ ÌÏÏÐ3 ÌÄÁ #0 ; ÃLEAR THE POINTER, VALUE AND SPEED ÓÔÁ ÐÏÉÎÔÅÒ ÓÔÁ ÖÁÌÕÅ ÓÔÁ ÓÐÅÅÄ ÌÏÏÐ4 ÔÙÁ ; (Ù WAS ZERO) ÏÒÁ #$80 ; ÕSE THE INVERTED CHARS ÓÔÁ ÓÃÒÅÅÎ,Ù ; ÓET THE CHARACTER CODES TO VIDEO MATRIX ÓÔÁ ÓÃÒÅÅÎ+40,Ù ÓÔÁ ÓÃÒÅÅÎ+80,Ù ÓÔÁ ÓÃÒÅÅÎ+120,Ù ÓÔÁ ÓÃÒÅÅÎ+160,Ù ÓÔÁ ÓÃÒÅÅÎ+200,Ù ÓÔÁ ÓÃÒÅÅÎ+240,Ù ÓÔÁ ÓÃÒÅÅÎ+280,Ù ÌÄÁ #239 ; LEAVE THE LAST LINE EMPTY ÓÔÁ ÓÃÒÅÅÎ+320,Ù ÉÎÙ ÃÐÙ #40 ÂÎÅ ÌÏÏÐ4 ; ÌOOP UNTIL THE WHOLE AREA IS FILLED ÃÌÉ ; ÅNABLE INTERRUPTS ÒÔÓ ÉÒÑ ÌÄÁ #ÂÁÎË ; ÃHANGE THE VIDEO BANK, SOME TIMING ÓÔÁ $ÄÄ00 ÎÏÐ ÎÏÐ ÌÄÙ ÐÏÉÎÔÅÒ ; Ù-REGISTER WILL POINT TO X-SHIFT ÊÍÐ ÂÁÄ ; NEXT LINE IS A BAD LINE ÌÏÏÐ5 ÎÏÐ ÌÏÏÐ6 ÌÄÁ ÓÈÉÆÔÌ,Ù ; ÄO THE SHIFT ÓÔÁ $Ä016 ; 3 LOWEST BITS ÌÄÁ ÓÈÉÆÔÈ,Ù ÓÔÁ $Ä018 ; ANOTHER 3 BITS ÎÏÐ : ÎÏÐ : ÎÏÐ : ÎÏÐ : ÎÏÐ : ÎÏÐ ; WASTE SOME TIME ÎÏÐ : ÎÏÐ : ÎÏÐ : ÎÏÐ : ÎÏÐ : ÎÏÐ ÎÏÐ : ÎÏÐ : ÎÏÐ ÌÄÁ $Ä012 ; CHECK IF IT IS TIME TO STOP ÃÍÐ #$78 ÂÐÌ ÏÖÅÒ ÉÎÙ ; NEXT POSITION IN TABLE ÄÅØ ÂÎÅ ÌÏÏÐ5 ; ÎO BAD LINE, LOOP ÂÁÄ ÌÄÁ ÓÈÉÆÔÌ,Ù ; ÔHIS IS A BAD LINE, A BIT MORE HURRY ÓÔÁ $Ä016 ÌÄÁ ÓÈÉÆÔÈ,Ù ÓÔÁ $Ä018 ÉÎÙ ÌÄØ #7 ; ÎEW BAD LINE COMING UP ÊÍÐ ÌÏÏÐ6 ÏÖÅÒ ÌÄÁ #$97 ; ÖIDEO BANK TO 'NORMAL' ÓÔÁ $ÄÄ00 ÌÄÁ #22 ; ÓAME WITH THE CHARSET ÓÔÁ $Ä018 ÌÄÁ #8 ; AND THE HORIZONTAL SCROLL REGISTER ÓÔÁ $Ä016 ÌÄÁ $ÄÃ00 ; ÌET'S CHECK THE JOYSTICKS ÁÎÄ $ÄÃ01 ÔÁØ ÌÄÙ ÓÐÅÅÄ ÁÎÄ #8 ; ÔURNED RIGHT, ADD SPEED ÂÎÅ ÅÉÐ ÉÎÙ ÃÐÙ #4 ; ÄON'T STORE, TOO MUCH SPEED ÂÐÌ ÅÉÐ ÓÔÙ ÓÐÅÅÄ ÅÉÐ ÔØÁ ÁÎÄ #4 ; ÔURNED LEFT ÂÎÅ ÕÌÏÓ ÄÅÙ ÃÐÙ #$Æà ; ÔOO MUCH ? ÂÍÉ ÕÌÏÓ ÓÔÙ ÓÐÅÅÄ ÕÌÏÓ ÌÄÁ ÖÁÌÕÅ ; ÁDD SPEED TO VALUE (SIGNED) ÃÌà ÁÄà ÓÐÅÅÄ ÂÐÌ ÏË ÌÄÁ ÓÐÅÅÄ ; ÂANGED TO THE SIDE ? ÅÏÒ #$ÆÆ ÃÌà ÁÄà #1 ÓÔÁ ÓÐÅÅÄ ÌÄÁ ÖÁÌÕÅ ÏË ÓÔÁ ÖÁÌÕÅ ÌÓÒ ; ÖALUE IS TWICE THE SHIFT ÔÁØ ; ÒEMEMBER THE SHIFT ÁÎÄ #7 ; LOWEST 3 BITS ÏÒÁ #8 ; (SCREEN 40 CHARS WIDE) ÌÄÙ ÐÏÉÎÔÅÒ ÓÔÁ ÓÈÉÆÔÌ,Ù ÔØÁ ÌÓÒ ÌÓÒ ÌÓÒ ; HIGHEST 3 BITS TOO ÁÓÌ ; MULTIPLICATED BY TWO ÓÔÁ ÓÈÉÆÔÈ,Ù ÄÅà ÐÏÉÎÔÅÒ ÌÄÁ #1 ; ÁCK THE INTERRUPT ÓÔÁ $Ä019 ÊÍÐ $ÅÁ31 ; ÔHE NORMAL INTERRUPT ROUTINE ÔÅØÔ ÓÃÒ "ÔÈÉÓ ÉÓ ÔÅÃÈ-ÔÅÃÈ ÆÏÒ Ã=64 ÂÙ ÍÅ" ; ÔEST TEXT ; ÓÃÒ CONVERTS TO SCREEN CODES -------------------------------------------------------------------------- ÂASIC LOADER FOR THE ÔECH-TECH DEMO PROGRAM (ÐÁÌ) 1 Ó=49152 2 ÄÅÆÆÎÈ(Ã)=Ã-48+7*(Ã>64) 3 ÃÈ=0:ÒÅÁÄÁ$,Á:ÐÒÉÎÔÁ$:ÉÆÁ$="ÅÎÄ"ÔÈÅÎÐÒÉÎÔ"":ÓÙÓ49152:ÅÎÄ 4 ÆÏÒÆ=0ÔÏ31:Ñ=ÆÎÈ(ÁÓÃ(ÍÉÄ$(Á$,Æ*2+1)))*16+ÆÎÈ(ÁÓÃ(ÍÉÄ$(Á$,Æ*2+2))) 5 ÃÈ=ÃÈ+Ñ:ÐÏËÅÓ,Ñ:Ó=Ó+1:ÎÅØÔ:ÉÆÃÈ=ÁÔÈÅÎ3 6 ÐÒÉÎÔ"ÃÈÅÃËÓÕÍ ÅÒÒÏÒ":ÅÎÄ 100 ÄÁÔÁ 78Á97Æ8Ä0ÄÄÃÁ9818Ä1ÁÄ0Á9ÁÄ8Ä1403Á9Ã08Ä1503Á9318Ä12Ä0Á91Â8Ä11Ä0Á0, 3802 101 ÄÁÔÁ 00Á24086ÆÃ84ÆÂ9891ÆÂÃ8Ä0ÆÂÅ6ÆÃ10Æ7Á94485ÆÃÁ9328501984Á4Á4ÁÁÁÂÄ5Å, 4749 102 ÄÁÔÁ Ã10Á0Á0ÁÁÁÁ9Ä069008Ä4ÅÃ0ÂÄ00Ä091ÆÂÅ8Ã88Á2907Ä0Æ4Ã000Ä0ÄÄÁ9378501, 4128 103 ÄÁÔÁ Â9004499084Ã99105499185Ã99206499286Ã99307499387ÃÃ8Ä0Å5Á9008Ä3Ã03, 3258 104 ÄÁÔÁ 8Ä3Ä038Ä3Å0398098099004099284099504099784099Á04099Ã84099Æ0409918, 3236 105 ÄÁÔÁ 41Á9ÅÆ994041Ã8Ã028Ä0ÄÂ5860Á9968Ä00ÄÄÅÁÅÁÁÃ3Ã034ÃÅ1Ã0ÅÁÂ900ÃÆ8Ä16, 4464 106 ÄÁÔÁ Ä0Â900ÃÅ8Ä18Ä0ÅÁÅÁÅÁÅÁÅÁÅÁÅÁÅÁÅÁÅÁÅÁÅÁÅÁÅÁÅÁÁÄ12Ä0Ã9781016Ã8ÃÁÄ0, 5850 107 ÄÁÔÁ Ä9Â900ÃÆ8Ä16Ä0Â900ÃÅ8Ä18Ä0Ã8Á2074ÃÂÂÃ0Á9978Ä00ÄÄÁ9168Ä18Ä0Á9088Ä, 4132 108 ÄÁÔÁ 16Ä0ÁÄ00ÄÃ2Ä01ÄÃÁÁÁÃ3Å032908Ä008Ã8Ã00410038Ã3Å038Á2904Ä00888Ã0ÆÃ, 3160 109 ÄÁÔÁ 30038Ã3Å03ÁÄ3Ä03186Ä3Å03100ÅÁÄ3Å0349ÆÆ1869018Ä3Å03ÁÄ3Ä038Ä3Ä034Á, 2139 110 ÄÁÔÁ ÁÁ29070908ÁÃ3Ã039900ÃÆ8Á4Á4Á4Á0Á9900ÃÅÃÅ3Ã03Á9018Ä19Ä04Ã31ÅÁ1408, 2759 111 ÄÁÔÁ 091320091320140503082Ä1405030820060Æ1220033Ä3634200219200Ä050Æ12, 652 200 ÄÁÔÁ ÅÎÄ,0 -------------------------------------------------------------------------- ÕUENCODED Ã64 EXECUTABLE VERSION OF THE DEMO PROGRAM (ÐÁÌ) BEGIN 644 TECH.64 ÍÀ0@-"À$À4[(Ô.3$Õ,@ÀÆ"À(ÀÅÊ5(*$,ÉÌÄ.Ë-#ÂÊ-ÚÐÈ0[$Ö-"ÄÀ7À@#À$-(Ê ÍÌÃÀÚÁÔ$Ä+$$ÚÆ4$Ä.ÈÍ!)+(Â14Ù$(Ê>9(ÃÓ7Ò,Ç4Ñ3Ø\Ð\Ó2/Â(ÚÇÃ0Ù,34Ò; Í.ÈÀÀÄÐ@$À(%&ÌÃ"Ä,Ó$Ú4;*Å2"Ã&*,ÈÈ020Ì1ÊÐÒÊÃ$É*2ÆÌ,3:ÊÉ4@ÈÑÂÃ*1 Í*$$Ä+$:Ì,ÊÈÒ*2ÄÉÀ+0(!0!#2+)#2*É1.É=3+%$Ú4[)3ÊÃ$Ú@ÃÊ+0ÔÂÒ0:<Ó? ÍÀ,Ð(!@"9(Ä-(14-+4Õ5-($524Ä]2(ÃÊÀÀ!Ä)9À"#(#<Ø03Ä×1ÃÁ$,$1$0Ô$ÙÎ Í.#$Ø1#%!1#!!.4%$.$0Ñ-#ÀÓ03Å#,#Á$,34Ð,Ô$Ù,Ó$Ø1#$Ò1#!!.3%".$0Ñ+ Í,40Ð03ÀÌ(#,Ø,#(À9@ÅÅÀ(,@,#!!,Ã0Ð.#9&0Ó@Ô1Ä(Ù.#ÄÑ1Ä)#.$0Ð1Ä)%Ç Í-Ä9#,3!&-Ô$Ù-#0Ø-49#03ÄÓ,Ã@Õ,#$Ù.#1!-$$Ô04%!0Ä0Õ12Ð@-#<Ô.0"Ó+ Í"68À@Ò!#,3!!,$$Ð04%!03Å$,#8Ù,#ÀØ1#1%0Ó!"1#ÀÐ1#ÀÙ,49"13Á#.#Á!] Í,ÃÄÐ-Ô0Ð1Ã1#,#ÀÐ1#!$1$$Ù,Ó<Ø-3ÀÑ+"ÀÔ,3(ØÀÀÀ*9Ð"#($(Ù,#ÀÔ-#ÄÙÅ Í,#@Ô0ÓÄÙ,3ÀÕ-#ÄÙ,3@Õ0ÓÄÙ,ÃÀÖ-#ÄÙ,Ã@Ö0ÓÄÙ,ÓÀ×-#ÄÙ,Ó@×0Ô,Ø1#!%, Í-4$Ù,#ÀØ1#-#,#,Ì(#,Ò-3@À30ÉÈÀ(,@.$0Ó1#ÀÓ.$0Ó13ÀÓ.3@Ð.3@Ð.3ÄÐÕ Í,#0Ð.3ÄÒ.#0Ð.3ÄÕ,#0Ð.3Ä×.#0Ð.3Å!,#0Ð.3Å#.#0Ð.3Å&,#0Ð.3ÄÑ."Ð@? Í,Ó(Ó-@":"ÆÄÀ@ÒÀÔ,4$Ù148Ù.30Ð-#%#.$,Ð,ÃÁ$,$1"-3@Ö,$$Ù.38Ø1#ÀÐ- Í1$1%045!04,Ó0ÓÀÓ-$-%,4,Ð14%".3ÀÐ0Ô8Ø1#$Ö+"ÀÔ-#8ÔÀ.<*:@"#($0ÐÎ Í0ÃÄÐ,$-%.$0Ñ.$0Ð14%%045!14%%045!14%%045!14%%045!14%%045!040Ñ, Í,Ä0Ð0ÓÄ×.#$Ð,39#.$-!1#ÀÌ(#4Ø-3ÀÀ-ÀÍËÀ(,@1#Å".3ÀÐ0Ô8Ø1#$Ö1#!"Ñ Í.3ÀÐ0Ô4Ø1#$Ø1#!#.$$Ò,#<Ô0Ô)"0Ó!!.3Ä×.$0Ð,$1$03ÄÑ-ÃÁ$,3Á$,$$Ù_ Í,#@Ø1"Ð@-#$Ó,@"!"ÖÐÀ@ÒÀÑ-Ä0Ð040Ð,$1#,Ä0Ð,41#04%!0Ó-%,#,Ò.3ÀØÎ Í1#ÀÐ.$,Ø0ÓÀÐ-#$Ð,#,Ø0Ó-%,#,Ø03(Ù,#1$,#ÀØ.#Á#,$9#+"ÀÓ,38ÐÀ,Ø+' Í;0"#(#,Ð,#,Ø0Ó-%,#-!1#-$,#,Ñ.#9$,Ô4Ð,Ó$Ð,$5!1#-%,#,Ô.49&,3@Ö7 Í.3ÀÑ.$0Ó13ÀÓ040Ó1#ÀÓ.$0Ó1#ÀÓ-$$Ì(#(Ñ,ÓÄÀ&ÐÑÎÀ(,@04$Ò.3À×,#ÄÐ; Í.$%#,Ô,Ð,ÓÄÙ,#!#1ÃÁ!-$$Ô031!,$$Ù.3ÀÐ0Ô5#13-#,#-!.3ÀÑ.$0Ñ.40ÐÉ Í-$,Ó,45!,30Ð."Ð@,Ã<Õ.0!Ç#&\À@ÒÀÐ.3$Ó,ÃÀÐ.3$Ó,ÃÀÑ-#ÀÕ,#,Ð.#)$_ Í,30Ð-3ÀÓ,#@Ò,#ÀÖ,$8Ñ,Ã(Ð,#,Ó1#,Ö,Ó0Ò,#ÀÒ,3ÄÒ,#!$,#4Ð1Ã$Ò+"ÀÖ& 4-3(À<ÐÓ(À(,@14Ù$+#ÀÀÀÀÀÀÀÀÈÓ! ÀÀ END ============================================================================= ÁÃÅ-128/64 ÐÒÏÇÒÁÍÍÅÒ'Ó ÒÅÆÅÒÅÎÃÅ ÇÕÉÄÅ (VERSION 0.9, FOR ÒELEASE #10) BY ÃRAIG ÂRUCE 1. ÉÎÔÒÏÄÕÃÔÉÏÎ ÁÃÅ IS A PROGRAM FOR THE ÃOMMODORE 128 AND ÃOMMODORE 64 THAT PROVIDES A COMMAND SHELL ENVIRONMENT THAT IS SIMILAR TO THAT OF ÕNIX. ÉT IS STILL IN THE DEVELOPMENT STAGE, BUT ENOUGH OF IT IS COMPLETE TO BE USEFUL. ÂÔ×, "ÁÃÅ" MEANS "ÁDVANCED ÃOMPUTING ÅNVIRONMENT" (WELL, ADVANCED FOR THE 128/64). ÓO WHAT IS ÁÃÅ ALL ABOUT? ×ELL, ORIGINALLY É TRIED A VERY AMBITIOUS PROJECT OF WRITING A MULTITASKING OPERATING SYSTEM FOR THE 128. ÉT GOT IT PARTIALLY WORKING, BUT IT WAS MUCH TOO FRAGILE AND INCOMPLETE TO BE RELEASED. ÉT WAS A WHITE-ELEPHANT PROJECT. ÓO, THEN THEN IT CAME TO ME THAT É WAS AIMING MUCH TOO HIGH. ×HAT É NEEDED WAS A MUCH SIMPLER SYSTEM, ONE THAT WOULD GIVE THE TYPE OF PROGRAMMING INTERFACE AND BUILT-IN FEATURES THAT É WANTED, BUT ONE THAT WAS CLOSE ENOUGH TO THE ÃOMMODORE ËERNAL THAT IT WOULD NOT REQUIRE MUCH OF A PROGRAMMING EFFORT TO HACK TOGETHER A MINIMAL IMPLEMENTATION. ÁND THUS, THERE WAS ÁÃÅ-128 ÒELEASE #1. ÁND É SAW IT WAS GOOD. ×HAT É WANTED WAS A SYSTEM THAT WOULD BE EASIER TO PROGRAM THAN THE ÃOMMODORE ËERNAL WITH ALL ITS WEIRD AND WONDERFUL DEVICE TYPES, NON-EXISTENT MEMORY MANAGEMENT, AND SINGLE-APPLICATION DESIGN. ÔHE FIRST IMPORTANT FEATURE OF THIS ENVIRONMENT WAS TO BE ABLE TO PASS ARGUMENTS FROM A COMMAND LINE TO AN APPLICATION PROGRAM BY TYPING THEM ON THE COMMAND LINE OF THE SHELL. ÉT IS SO ANNOYING TO LOAD UP A PROGRAM IN ÂÁÓÉÃ, RUN IT, AND HAVE IT ASK YOU FOR FILENAMES IN SOME HIGHLY INCONVENIENT WAY. ÁNOTHER IMPORTANT SYSTEM FEATURE IS TO MAKE NEAR AND FAR MEMORY MANAGEMENT PART OF THE SYSTEM, AND TO MAKE FAR MEMORY CONVENIENT TO USE FOR STORING MASSIVELY BULKY DATA. ÁND SO IT WAS. ÁLSO, WE WANT TO USE CUSTOM DEVICE DRIVERS. ÃOMMODORE DIDN'T REALLY COME THROUGH WITH THE DEVICE DRIVERS IT PROVIDED. ÔHEY ARE ALL ÒÅÁÌÌÙ ÓÌÏ×. ÁND SO THAT WAS, ALSO, ALTHOUGH MORE CUSTOM DEVICE DRIVERS ARE NEEDED. ×E WANT TO HAVE THE CAPABILITY OF MAKING PROGRAMS WORK TOGETHER, RATHER THAN HAVING PROGRAMS THAT ARE TOTALLY INCOMPATIBLE. ÔHIS FUNCTIONALITY IS STILL UNDER CONSTRUCTION. ÐROGRAMS WILL WORK TOGETHER IN THIS UNI-TASKING ENVIRONMENT BY ALLOWING A PROGRAM TO EXECUTE ANOTHER PROGRAM AS A SUB-TASK, AND THEN HAVING CONTROL RETURN TO THE CALLING PROGRAM UPON EXIT. ÆINALLY, WE WANT SOME GOOD QUALITY APPLICATIONS AND A POWERFUL COMMAND SHELL. ÔHIS IS STILL BEING WORKED ON AND PROGRESS IS COMING SLOWLY. ÏH, ALMOST FORGOT; WE ALSO WANT ALL PROGRAMS TO WORK ON BOTH THE Ã64 AND Ã128, AND THEY DO. ÔHIS DOCUMENTATION REFERS TO ÁÃÅ RELEASE #10, WHICH HAS NOT BEEN RELEASED YET (OR EVEN PROGRAMMED). ÉN FACT, THE CURRENT RELEASE IS #9. ÒELEASE #10 WILL BE SPRUCED UP FROM THE INSIDE OUT TO SUPPORT THE SYSTEM INTERFACE DESCRIBED IN THIS DOCUMENT. ÔHE CURRENT RELEASE IS NOT BEING DESCRIBED, BECAUSE SOME OF ITS FEATURES ARE NOT THE BEST THEY COULD POSSIBLY BE. ÎOTE, HOWEVER, THAT THE BASIC FEATURES, LIKE "OPEN", "READ", "DIRREAD", AND ARGV ARE NOT GOING TO CHANGE. ÎOTE ALSO THAT THE VERSION NUMBER OF THIS "Ð.Ò.Ç." IS 0.9. ÔHIS IS BECAUSE THIS IS THE FIRST INCARNATION OF THIS DOCUMENT AND, CONSIDERING ITS NATURE, IS BOUND TO HOLD A LARGE NUMBER OF SMALL ERRORS. 2. ÓÙÓÔÅÍ ÉÎÔÅÒÆÁÃÅ ÔHIS SECTION DESCRIBES THE INTERFACE BETWEEN USER PROGRAMS AND THE ÁÃÅ KERNEL. É AM VERY CAREFUL THROUGHOUT THIS INTERFACE SPECIFICATION ABOUT REVEALING ANY INTERNAL DETAILS THAT YOU DO NOT STRICTLY NEED TO KNOW. ÔHE INTERFACE WITH ÁÃÅ IS NOT SPECIFIED IN TERMS OF ABSOLUTE ADDRESSES; TO AID IN PORTABILITY AND EXTENSIBILITY, ALL INTERFACES ARE SPECIFIED IN TERMS OF SYMBOLIC ASSEMBLER LABELS. ÁLL OF THE ÁÃÅ CODE IS CURRENTLY WRITTEN FOR THE ÂUDDY-128 ASSEMBLER. ÁLSO, BECAUSE THESE INTERFACE ABSOLUTE ADDRESSES ARE SUBJECT TO CHANGE FROM VERSION TO VERSION OF THE KERNEL, EXECUTABLES COMPILED FOR USE WITH AN OLD VERSION OF ÁÃÅ MAY NOT WORK WITH A NEW VERSION. 2.1. ÚÅÒÏ-ÐÁÇÅ ÖÁÒÉÁÂÌÅÓ ÔHERE ARE FOUR ZERO-PAGE VARIABLES USED FOR PASSING ARGUMENTS IN MOST SYSTEM CALLS. ÔHEY ARE AS FOLLOWS: ÓÙÍÂÏÌ ÂÙÔÅÓ ÄÅÓÃÒÉÐÔÉÏÎ ------- ----- ----------- ZP 2 ZEROPAGE POINTER ZW 2 ZEROPAGE WORD MP 4 MEMORY POINTER SYSWORK 16 SYSTEM WORK AREA / ARGUMENTS ÔHE FIRST TWO, "ZP" AND "ZW" ARE USED IN MOST CALLS. ÔHEY STORE SIMPLE 16-BIT VALUES; "ZP" USUALLY STORES POINTERS TO STRINGS IN ÒÁÍ0 MEMORY. ÔHE "MP" VARIABLE IS 32-BITS IN LENGTH AND IS USED EXCLUSIVELY FOR PASSING FAR MEMORY POINTERS FOR USE WITH THE FAR MEMORY ROUTINES. ÁLL THREE OF THESE VARIABLES WILL REMAIN UNCHANGED INSIDE OF SYSTEM CALL UNLESS THEY WILL CONTAIN A RETURN VALUE. "SYSWORK" IS A 16-BYTE ARRAY USED MAINLY WHEN THERE ARE TOO MANY ARGUMENTS FOR OTHER VARIABLES TO HOLD, AND ALL NON-INPUT AND NON-OUTPUT BYTES OF "SYSWORK" ARE SUBJECT TO CHANGE BY THE KERNEL. ÁLL INPUT ARGUMENTS PLACED IN THE "SYSWORK" LOCATIONS WILL BE PRESERVED UNLESS OTHERWISE INDICATED. [ÎOTE: ÉN ÒELEASE #9, "ZP" TOOK ON THE ROLLS OF BOTH "ZP" AND "MP"]. 2.2. ÓÙÓÔÅÍ ÖÁÒÉÁÂÌÅÓ ÔHERE ARE SEVERAL NON-ZEROPAGE VARIABLES FOR STORING SYSTEM STATUS AND RETURN VALUES: ÓÙÍÂÏÌ ÂÙÔÅÓ ÄÅÓÃÒÉÐÔÉÏÎ ---------- ----- ----------- ERRNO 1 ERROR NUMBER CODE RETURNED BY FAILED SYSTEM CALLS ACEÉÄ 2 PROOF THAT USER PROGRAM IS RUNNING ON TOP OF ÁÃÅ ACEÁRGC 2 ARGUMENT COUNT FOR CURRENT PROCESS ACEÁRGV 2 ARGUMENT VECTOR ADDRESS FOR CURRENT PROCESS ACEÍEMÔOP 2 HIGHEST ADDRESS, PLUS ONE, THAT USER PROG CAN USE ACEÓHELLÐATH 2 PTR TO STORAGE FOR SEARCH PATH FOR EXECUTABLE PROGRAMS ACEÓHELLÁLIAS 2 PTR TO STORAGE FOR SHELL COMMAND ALIASES ACEÃURÄIRÎAME 2 PTR TO STORAGE FOR THE CURRENT DIRECTORY NAME ACEÅXITÄATA 2 PTR TO STORAGE FOR EXIT STATUS FROM THE LAST CALLED PRG ACEÄIRENTÂUFFER STORAGE FOR DIRECTORY ENTRIES READ FROM DISK ACEÄIRENTÌENGTH - REALLY A CONSTANT: LENGTH IN BYTES OF "ACEÄIRENTÂUFFER" ACEÄIRENTÂYTES 4 BYTES IN FILE (USUALLY INEXACT) ACEÄIRENTÄATE 8 DATE OF FILE IN "ÙÙ:ÙÙ:ÍÍ:ÄÄ:ÈÈ:ÍÍ:ÓÓ:Ô×" FORMAT ACEÄIRENTÔYPE 4 TYPE OF FILE IN NULL-TERMINATED STRING ACEÄIRENTÆLAGS 1 FLAGS OF FILE, "DRWX*-ET" FORMAT ACEÄIRENTÎAMEÌEN 1 LENGTH OF NAME OF FILE ACEÄIRENTÎAME 17 NULL-TERMINATED NAME OF FILE ÅÒÒÎÏ: "ERRNO" IS USED TO RETURN ERROR CODES FROM SYSTEM CALLS. ×HEN A SYSTEM CALL ENDS IN ERROR, IT SETS THE CARRY FLAG TO "1", PUTS THE ERROR CODE IN "ERRNO", AND RETURNS TO THE USER PROGRAM, AFTER UNDOING ANY SYSTEM WORK COMPLETED AT THE TIME THE ERROR IS ENCOUNTERED AND ABORTING THE OPERATION. ÁN ERROR CODE NUMBER IS STORED IN BINARY IN THE SINGLE-BYTE "ERRNO" LOCATION. ÔHE SYMBOLIC NAMES FOR THE POSSIBLE ERROR CODES ARE GIVEN IN THE NEXT SECTION. ÉF NO ERROR OCCURS IN A SYSTEM CALL, THE CARRY FLAG WILL BE CLEARED ON RETURN FROM THE CALL. ÎOTE THAT NOT ALL SYSTEM CALLS CAN RUN INTO ERRORS, SO NOT ALL SET THE CARRY FLAG ACCORDINGLY. ÉÄ: "ACEÉÄ" IS A TWO-BYTE VARIABLE. ÉTS PURPOSE IS TO ALLOW USER PROGRAMS TO BE SURE THAT THEY ARE EXECUTING ON TOP OF ÁÃÅ. ÔHE LOW BYTE (I.E., THE FIRST BYTE) MUST BE EQUAL TO THE SYMBOLIC CONSTANT "ACEÉÄ1", AND THE HIGH, "ACEÉÄ2". ÔHIS WILL ALLOW ÁÃÅ APPLICATIONS TO INFORM IDIOT USERS THAT THEY CANNOT SIMPLY ÂÏÏÔ THE PROGRAM FROM ÂÁÓÉÃ, BUT RATHER THEY MUST RUN ÁÃÅ FIRST. ÁÒÇÃ: "ACEÁRGC" IS A TWO-BYTE UNSIGNED NUMBER. ÉT GIVES THE NUMBER OF ARGUMENTS PASSED TO THE APPLICATION BY THE PROGRAM (USUALLY THE COMMAND SHELL) THAT CALLED THE APPLICATION. ÔHE FIRST ARGUMENT IS ALWAYS THE NAME OF THE APPLICATION PROGRAM, SO THE COUNT WILL ALWAYS BE AT LEAST ONE. ÏTHER ARGUMENTS ARE OPTIONAL. ÁÒÇÖ: "ACEÁRGV" IS A TWO-BYTE ÒÁÍ0 POINTER. ÐAY ATTENTION. ÔHIS POINTER POINTS TO THE FIRST ENTRY OF AN ARRAY OF TWO-BYTE POINTERS WHICH POINT TO THE NULL-TERMINATED STRINGS THAT ARE THE ARGUMENTS PASSED TO THE APPLICATION PROGRAM BY THE CALLER. (Á NULL-TERMINATED STRING IS ONE THAT ENDS WITH A ZERO BYTE). ÔO FIND THE ADDRESS OF THE Î-TH ARGUMENT TO AN APPLICATION, MULTIPLY Î BY TWO, ADD THE "ACEÁRGV" CONTENTS TO THAT, AND FETCH THE POINTER FROM THAT ADDRESS. ÉN THIS SCHEME, THE EVER-PRESENT APPLICATION NAME IS THE 0-TH ARGUMENT. ÔHE ARGV[ARGC] ELEMENT OF THE ARGUMENT VECTOR WILL ALWAYS CONTAIN A VALUE OF $0000, A NULL POINTER. ÍÅÍ-ÔÏÐ: "ACEÍEMÔOP" IS A TWO-BYTE ÒÁÍ0 POINTER. ÔHIS POINTS TO ONE BYTE PAST THE HIGHEST BYTE THAT THE APPLICATION PROGRAM IS ALLOWED TO USE. ÁLL APPLICATION PROGRAMS ARE LOADED INTO MEMORY AT ADDRESS "ACEÁPPÁDDRESS" (NEXT SECTION), AND ALL MEMORY BETWEEN THE END OF THE PROGAM CODE AND "ACEÍEMÔOP" CAN BE USED FOR TEMPORARY VARIABLES, FILE BUFFERS, ETC. ÔHE MAIN PROBLEM WITH THIS APPROACH IS THAT THERE ARE NO GUARANTEES ABOUT HOW MUCH MEMORY YOUR APPLICATION WILL GET TO PLAY WITH. ÍANY APPLICATIONS, SUCH AS SIMPLE FILE UTILITIES, CAN SIMPLY USE ALL AVAILABLE MEMORY FOR A FILE BUFFER, BUT OTHER PROGRAMS, SUCH AS A FILE COMPRESSOR, MAY HAVE MUCH GREATER DEMAND FOR "NEAR" MEMORY. [ÎOTE: THIS VARIABLE HAS A DIFFERENT NAME IN ÒELEASE #9]. ÓÈÅÌÌ-ÐÁÔÈ: "ACEÓHELLÐATH" IS A TWO-BYTE ÒÁÍ0 POINTER. ÔHIS POINTS TO THE PAGE OF MEMORY THAT STORES THE PATHNAMES OF DIRECTORIES TO SEARCH THROUGH IN ORDER TO FIND EXECUTABLE FILES. ÅACH PATHNAME IS STORED AS A NULL-TERMINATED STRING, AND THE LIST IS TERMINATED BY AN EMPTY STRING (CONTAINING ONLY THE ZERO CHARACTER). ÔHIS IS INTENDED TO BE USED BY THE SHELL PROGRAM, OR ANY OTHER PROGRAM THAT IS SO INCLINED, TO EXAMINE OR ALTER THE SEARCH PATH. ÔHE SEARCH PATHS SPECIFIED IN THE PATH PAGE ARE GLOBAL VARIABLES AND ARE USED BY ALL PROGRAMS THAT MAKE THE "EXEC" SYSTEM CALL. ÔHIS MECHANISM FOR READING/ALTERING THE EXECUTABLE SEARCH PATH MAY BE CHANGED IN THE FUTURE. ÓÈÅÌÌ-ÁÌÉÁÓ: "ACEÓHELLÁLIAS" IS A TWO-BYTE ÒÁÍ0 POINTER. ÔHIS POINTS TO THE PAGE OF MEMORY THAT STORES THE ALIASES TO BE USED WITH THE COMMAND SHELL. ÁN ALIAS IS A STRING THAT IS SUBSTITUTED IN THE PLACE OF A COMMAND NAME ON A SHELL COMMAND LINE WHENEVER A CERTAIN COMMAND NAME COMES UP. ÆOR EXAMPLE, YOU MIGHT SPECIFY IF THE USER ENTERS THE COMMAND "LIST A:" THAT THE COMMAND NAME "LIST" BE STRING-REPLACED WITH "CLS;XLS -L". ÅACH ALIAS IS STORED WITH THE COMMAND NAME FIRST, FOLLOWED BY AN EQUALS CHARACTER ("="), FOLLOWED BY THE STRING TO SUBSTITUTE, FOLLOWED BY A ZERO. ÔHE ALIAS LIST IS TERMINATED BY AN EMPTY STRING. ÔHIS MECHANISM MAY BE EXTENDED IN THE FUTURE TO ALLOW MULTIPLE PAGES OF ALIASES, OR MAY BE CHANGED COMPLETELY. ÃÕÒ-ÄÉÒ-ÎÁÍÅ: "ACEÃURÄIRÎAME" IS A TWO-BYTE ÒÁÍ0 POINTER. ÉT POINTS TO THE NULL-TERMINATED STRING INDICATING THE CURRENT DIRECTORY. ÔHE USER IS NOT SUPPOSED TO MODIFY THIS VALUE, AND THE VALUE WILL NOT ALWAYS GIVE A FULL PATHNAME. ÔHE IMPLEMENTATION OF THIS FEATURE MAY NEED TO CHANGE IN FUTURE VERSIONS OF ÁÃÅ. ÁÃÅ-ÅØÉÔ-ÄÁÔÁ: "ACEÅXITÄATA" IS A TWO-BYTE ÒÁÍ0 POINTER. ÉT POINTS TO THE 256-BYTE BUFFER ALLOCATED FOR USER PROGRAMS TO GIVE DETAILED RETURN INFORMATION UPON EXITING BACK TO THEIR PARENT PROGRAM. ÓEE THE "EXIT" SYSTEM CALL. ÕSER PROGRAMS ARE ALLOWED TO READ AND WRITE THIS STORAGE. ÁN EXAMPLE USE OF THIS FEATURE WOULD BE A COMPILER PROGRAM RETURNING THE LINE NUMBER AND CHARACTER POSITION, AND DESCRIPTION OF A COMPILATION ERROR TO A TEXT EDITOR, SO THE EDITOR CAN POSITION THE CURSOR AND DISPLAY THE ERROR MESSAGE FOR USER CONVENIENCE. ÔHE IMPLEMENTATION OF THIS FEATURE MAY NEED TO CHANGE IN FUTURE VERSIONS OF ÁÃÅ. ÄÉÒÅÎÔ-ÂÕÆÆÅÒ: "ACEÄIRENTÂUFFER" IS A BUFFER USED FOR STORING DIRECTORY INFORMATION READ WITH THE "DIRREAD" SYSTEM CALL, AND IS "ACEÄIRENTÌENGTH" BYTES LONG. ÏNLY A SINGLE DIRECTORY ENTRY IS (LOGICALLY) READ FROM DISK AT A TIME. ÔHE INDIVIDUAL FIELDS OF A READ DIRECTORY ENTRY ARE ACCESSED BY THE FIELDS DESCRIBED NEXT. ÔHIS FIELD IS ALSO USED FOR RETURNING DISK NAME INFORMATION AND THE NUMBER OF BYTES FREE ON A DISK DRIVE (SEE THE "DIRREAD" SYSTEM CALL). ÄÉÒÅÎÔ-ÂÙÔÅÓ: "ACEÄIRENTÂYTES" IS A FOUR-BYTE (32-BIT) UNSIGNED FIELD. ÁS ALWAYS, THE BYTES ARE ADDRESSED FROM LEAST SIGNIFICANT TO MOST SIGNIFICANT. ÔHIS FIELD GIVES THE NUMBER OF BYTES IN THE FILE. ÎOTE THAT THIS VALUE MAY NOT BE EXACT, SINCE ÃOMMODORE DECIDED TO STORE SIZES IN DISK BLOCKS RATHER THAN BYTES. ÆOR DEVICES THAT REPORT ONLY BLOCK COUNTS (I.E., EVERY DISK DEVICE CURRENTLY SUPPORTED), THE NUMBER OF BYTES RETURNED IS THE NUMBER OF BLOCKS MULTIPLIED BY 254. ÔHIS FIELD, AS WELL AND THE OTHER DIRENT FIELDS ARE ABSOLUTE ADDRESSES, NOT OFFSETS FROM ACEÄIRENTÂUFFER. ÄÉÒÅÎÔ-ÄÁÔÅ: "ACEÄIRENTÄATE" IS AN EIGHT-BYTE ARRAY OF BINARY CODED DECIMAL VALUES, STORED FROM MOST SIGNIFICANT DIGITS TO LEAST SIGNIFICANT. ÔHE FIRST BYTE CONTAINS THE ÂÃÄ CENTURY, THE SECOND THE YEAR, AND SO ON, AND THE LAST BYTE CONTAINS THE NUMBER OF TENTHS OF SECONDS IN ITS MOST SIGNIFICANT NYBBLE AND A CODE FOR THE DAY-OF-WEEK IN ITS LEAST SIGNIFICANT NYBBLE. ÓUNDAY HAS CODE 1, ÍONDAY 2, ETC., ÓATURDAY 7, AND A CODE OF 0 MEANS "UNKNOWN". ÔHIS IS THE STANDARD FORMAT FOR ALL DATES USED IN ÁÃÅ. ÔHIS FORMAT IS ABSTRACTED AS "ÙÙ:ÙÙ:ÍÍ:ÄÄ:ÈÈ:ÍÍ:ÓÓ:Ô×". ÆOR DISK DEVICES THAT DON'T SUPPORT DATES, THIS FIELD WILL BE SET TO ALL ZEROES, WHICH CAN BE CONVENIENTLY INTERPRETED AS THE ÎÕÌÌ DATE, NEGATIVE INFINITY, OR AS THE TIME THAT Ê.Ã. WAS A SEVEN-YEAR-OLD BOY. ÄÉÒÅÎÔ-ÔÙÐÅ: "ACEÄIRENTÔYPE" IS A THREE-CHARACTER (FOUR-BYTE) NULL-TERMINATED STRING. ÉT INDICATES WHAT TYPE THE FILE IS, IN LOWERCASE ÐÅÔÓÃÉÉ. ÓTANDARD TYPES SUCH AS "ÓÅÑ" AND "ÐÒÇ" WILL BE RETURNED, AS WELL AND OTHER POSSIBILITIES FOR CUSTOM DEVICE DRIVERS. ÄÉÒÅÎÔ-ÆÌÁÇÓ: "ACEÄIRENTÆLAGS" IS A ONE-BYTE FIELD THAT IS INTERPRETED AS CONSISTING OF EIGHT INDEPENDENT ONE-BIT FIELDS. ÔHE ABSTRACT VIEW OF THE FIELDS IS "DRWX*-ET". "D" MEANS THAT THE ITEM IS A SUBDIRECTORY (OTHERWISE IT IS A REGULAR FILE), "R" MEANS THE ITEM IS READABLE, "W" MEANS THE ITEM IS WRITABLE, AND "X" MEANS THE ITEM IS EXECUTABLE. ÔHE "X" OPTION IS REALLY NOT SUPPORTED CURRENTLY. "*" MEANS THE ITEM IS IMPROPERLY CLOSED (A "SPLAT" FILE IN ÃOMMODORE-ÄÏÓ TERMINOLOGY). ÔHE "-" FIELD IS CURRENTLY UNDEFINED. "E" MEANS THAT THE VALUE GIVEN IN THE "ACEÄIRENTÂYTES" FIELD IS ACTUALLY EXACT, AND "T" MEANS THE FILE SHOULD BE INTERPRETED AS BEING A "TEXT" FILE (OTHERWISE, ITS TYPE IS EITHER BINARY OR UNKNOWN). ÔHE BIT FIELDS ARE ALL BOOLEANS; A VALUE OF "1" MEANS TRUE, "0", FALSE. ÔHE "D" BIT OCCUPIES THE 128-BIT POSITION, ETC. ÄÉÒÅÎÔ-ÎÁÍÅ-ÌÅÎ: "ACEÄIRENTÎAMEÌEN" IS A ONE-BYTE NUMBER. ÉT GIVES THE NUMBER OF CHARACTERS IN THE FILENAME. ÉT IS PRESENT FOR CONVENIENCE. ÄÉÒÅÎÔ-ÎÁÍÅ: "ACEÄIRENTÎAME" IS A 16-CHARACTER (17-BYTE) NULL-TERMINATED CHARACTER STRING FIELD. ÉT GIVES THE NAME OF THE FILE OR DIRECTORY OR DISK. ÆILENAMES USED WITH ÁÃÅ ARE LIMITED TO 16 CHARACTERS. 2.3. ÓÙÓÔÅÍ ÃÏÎÓÔÁÎÔÓ ÔHERE ARE SEVERAL SYMBOLIC CONSTANTS THAT ARE USED WITH THE ÁÃÅ SYSTEM INTERFACE: ÓÙÍÂÏÌ ÄÅÓÃÒÉÐÔÉÏÎ ------------------- ------------------------- ACEÁPPÁDDRESS THE START ADDRESS OF APPLICATIONS ACEÉÄ1 THE ID CHARACTERS USED TO IDENTIFY ÁÃÅ APPLICATIONS ACEÉÄ2 ... ACEÉÄ3 ... ACEÍEMÎULL THE FAR MEMORY TYPE CODE USED TO INDICATE NULL PTRS ACEÍEMÒÅÕ FAR MEM TYPE CODE FOR ÒAM ÅXPANSION ÕNIT MEMORY ACEÍEMÉNTERNAL FAR MEM TYPE CODE FOR INTERNAL MEMORY ACEÍEMÒÌÒÅÕ FAR MEM TYPE CODE FOR ÒÅÕ MEMORY ACCESSED THRU ÒÁÍÌINK ACEÍEMÒÌ FAR MEM TYPE CODE FOR DIRECT-ACCESS ÒÁÍÌINK MEMORY ACEÅRRÓTOPPED ERROR CODE FOR SYSCALL ABORTED BY ÓÔÏÐ KEY ACEÅRRÔOOÍANYÆILES ERR: TOO MANY FILES ALREADY OPENED TO OPEN ANOTHER ACEÅRRÆILEÏPEN ERR: DON'T KNOW WHAT THIS MEANS ACEÅRRÆILEÎOTÏPEN ERR: THE GIVEN FILE DESCRIPTOR IS NOT ACTUALLY OPEN ACEÅRRÆILEÎOTÆOUND ERR: NAMED FILE TO OPEN FOR READING DOES NOT EXIST ACEÅRRÄEVICEÎOTÐRESENT ERR: THE SPECIFIED PHYSICAL DEVICE IS NOT ONLINE ACEÅRRÆILEÎOTÉNPUT ERR: FILE CANNOT BE OPENED FOR READING ACEÅRRÆILEÎOTÏUTPUT ERR: FILE CANNOT BE OPENED FOR WRITING ACEÅRRÍISSINGÆILENAME ERR: PATHNAME COMPONENT IS THE NULL STRING ACEÅRRÉLLEGALÄEVICE ERR: THE SPECIFIED DEVICE CANNOT DO WHAT YOU WANT ACEÅRR×RITEÐROTECT ERR: TRYING TO WRITE TO A DISK THAT IS WRITE-PROTECTED ACEÅRRÆILEÅXISTS ERR: TRYING TO OPEN FOR WRITING FILE THAT EXISTS ACEÅRRÆILEÔYPEÍISMATCH ERR: YOU SPECIFIED THE FILE TYPE INCORRECTLY ACEÅRRÎOÃHANNEL ERR: TOO MANY OPEN FILES ON DISK DRIVE TO OPEN ANOTHER ACEÅRRÉNSUFFICIENTÍEMORY ERR: ÁÃÅ COULD NOT ALLOCATE THE MEMORY YOU REQUESTED ACEÅRRÏPENÄIRECTORY ERR: YOU ARE TRYING TO OPEN A DIR AS IF IT WERE A FILE ACEÅRRÄISKÏNLYÏPERATION ERR: TRYING TO PERFORM DISK-ONLY OP ON CHAR DEVICE ACEÅRRÎULLÐOINTER ERR: TRYING TO DEREFERENCE A NULL FAR POINTER ACEÅRRÉNVALIDÆREEÐARMS ERR: BAD CALL TO "PAGEFREE": MISALIGNED/WRONG SIZE ACEÅRRÆREEÎOTÏWNED ERR: TRYING TO FREE FAR MEMORY YOU DON'T OWN STDIN FILE DESCRIPTOR RESERVED FOR STDIN INPUT STREAM STDOUT FILE DESCRIPTOR RESERVED FOR STDOUT OUTPUT STREAM STDERR FILE DESCRIPTOR RESERVED FOR STDERR OUTPUT STREAM "ACEÁPPÁDDRESS", AS DISCUSSED BEFORE, IS THE ADDRESS THAT APPLICATION PROGRAMS ARE LOADED INTO MEMORY AT. ÔHEY MUST, OF COURSE, BE COMPILED TO EXECUTE STARTING AT THIS ADDRESS. ÔHE "ACEÍEM" GROUP OF CONSTANTS ARE FOR USE WITH THE "PAGEALLOC" SYSTEM CALL, EXCEPT FOR "ACEÍEMÎULL", WHICH MAY BE USED BY APPLICATION PROGRAMS FOR INDICATING NULL FAR POINTERS. ÔHE "PAGEALLOC" CALL ALLOWS YOU TO SPECIFY WHAT TYPES OF MEMORY YOU ARE WILLING TO ACCEPT. ÔHIS IS IMPORTANT BECAUSE THE DIFFERENCE TYPES OF MEMORY HAVE DIFFERENT PERFORMANCE CHARACTERISTICS. ÁÃÅ WILL TRY TO GIVE YOU THE FASTEST MEMORY THAT IS AVAILABLE. ÒAM ÅXPANSION ÕNIT MEMORY HAS STARTUP AND BYTE-TRANSFER TIMES OF ABOUT 60 US (MICROSECONDS) AND 1 US, RESPECTIVELY. ÔHIS IS THE FASTEST TYPE OF FAR MEMORY. ÉNTERNAL MEMORY HAS A STARTUP TIME OF 24 US AND A BYTE-TRANSFER TIME OF BETWEEN 7 AND 14 US (DEPENDING ON WHETHER ACCESSING ÒÁÍ0 OR ÒÁÍ1+). ÒÅÕ MEMORY ACCESSED THROUGH A ÒÁÍÌINK HAS A TERRIBLE STARTUP TIME OF 1000 US AND A BYTE-TRANSFER TIME OF 2 US. ÄIRECT-ACCESS ÒÁÍÌINK MEMORY HAS A STARTUP TIME OF 1000 US AND A BYTE-TRANSFER TIME OF 16 US. ÁLL THESE TIMES ARE FOR THE Ã128 IN 2 ÍÈZ MODE. ÔHE "ACEÅRR" GROUP GIVES THE ERROR CODES RETURNED BY SYSTEM CALLS. ÔHE ERROR CODES ARE RETURNED IN THE "ERRNO" VARIABLE. ÎOT ALL POSSIBLE ERROR CODES FROM ÃOMMODORE DISK DRIVES ARE COVERED, BUT THE IMPORTANT ONES ARE. ÆINALLY, THE "STD" FILES GROUP GIVE THE SYMBOLIC FILE DESCRIPTOR IDENTIFIERS OF THE DEFAULT INPUT, OUTPUT, AND ERROR OUTPUT FILE STREAMS. 2.4. ÓÙÓÔÅÍ ÃÁÌÌÓ ÁLL SYSTEM CALLS ARE CALLED BY SETTING UP ARGUMENTS IN SPECIFIED PROCESSOR REGISTERS AND MEMORY LOCATIONS, EXECUTING A ÊÓÒ TO THE SYSTEM CALL ADDRESS, AND PULLING THE RETURN VALUES OUT OF PROCESSOR REGISTERS AND MEMORY LOCATIONS. 2.1. ÆÉÌÅ ÃÁÌÌÓ ÎÁÍÅ : OPEN ÐÕÒÐÏÓÅ: OPEN A FILE ÁÒÇÓ : (ZP) = PATHNAME .Á = FILE MODE ("R", "W", OR "A") ÒÅÔÕÒÎÓ: .Á = FILE DESCRIPTOR NUMBER .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Ø, .Ù, ERRNO ÏPENS A FILE. ÔHE NAME OF THE FILE IS GIVEN BY A POINTER TO A NULL-TERMINATED STRING, AND MAY CONTAIN DEVICE NAMES AND PATHNAMES AS SPECIFIED IN THE ÁÃÅ USER DOCUMENTATION. ÔHE FILE MODE IS A ÐÅÔÓÃÉÉ CHARACTER. "R" MEANS TO OPEN THE FILE FOR READING, "W" MEANS TO OPEN THE FILE FOR WRITING, AND "A" MEANS TO OPEN THE FILE FOR APPENDING (WRITING, STARTING AT THE END OF THE FILE). ÁN ERROR WILL BE RETURNED IF YOU ATTEMPT TO OPEN FOR READING OR APPENDING A FILE THAT DOES NOT EXIST, OR IF YOU ATTEMPT TO OPEN FOR WRITING A FILE THAT DOES ALREADY EXIST. ÉF YOU WISH TO OVERWRITE AN EXISTING FILE, YOU WILL HAVE TO CALL "REMOVE" TO DELETE THE OLD VERSION BEFORE OPENING THE NEW VERSION FOR WRITING. ÔHE FUNCTION RETURNS A FILE DESCRIPTOR NUMBER, WHICH IS A SMALL UNSIGNED INTEGER THAT IS USED WITH OTHER FILE CALLS TO SPECIFY THE FILE THAT HAS BEEN OPENED. ÆILE DESCRIPTORS NUMBERED 0, 1, AND 2 ARE USED FOR STDIN, STDOUT, AND STDERR, RESPECTIVELY. ÔHE FILE DESCRIPTOR RETURNED WILL BE THE MINIMUM NUMBER THAT IS NOT CURRENTLY IN USE. ÔHESE NUMBERS ARE SYSTEM-WIDE (RATHER THAN LOCAL TO A PROCESS AS IN ÕNIX), AND THIS HAS SOME IMPLICATIONS FOR É/Ï REDIRECTION (SEE THE "FDSWAP" CALL BELOW). ÒESTRICTIONS: ONLY SO MANY ËERNAL FILES ALLOWED TO BE OPEN ON A DISK DEVICE, AND THERE IS A SYSTEM MAXIMUM OF OPEN FILES. ÙOU WILL GET A "TOO MANY FILES" ERROR IF YOU EVER EXCEED THIS LIMIT. ÁLSO, BECAUSE OF THE NATURE OF ÃOMMODORE-ÄÏÓ, THERE MAY BE EVEN TIGHTER RESTRICTIONS ON THE NUMBER OF FILES THAT CAN BE SIMULTANEOUSLY OPEN ON A SINGLE DISK DEVICE, RESULTING IN A "NO CHANNEL" ERROR. ÎOTE THAT THIS CALL CHECKS THE STATUS CHANNEL OF ÃOMMODORE DISK DRIVES ON EACH OPEN, SO YOU DON'T HAVE TO (AND SHOULD NOT ANYWAY). ÉF THE CURRENT PROGRAM EXITS EITHER BY CALLING "EXIT" OR SIMPLY BY DOING THE LAST ÒÔÓ, ALL FILES THAT WERE OPENED BY THE PROGRAM AND ARE STILL OPEN WILL BE AUTOMATICALLY CLOSED BY THE SYSTEM BEFORE RETURNING TO THE PARENT PROGRAM. ÎÁÍÅ : CLOSE ÐÕÒÐÏÓÅ: CLOSE AN OPEN FILE ÁÒÇÓ : .Á = ÆILE DESCRIPTOR NUMBER ÒÅÔÕÒÎÓ: .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÃLOSES AN OPEN FILE. ÎOT MUCH TO SAY ABOUT THIS ONE. ÎÁÍÅ : READ ÐÕÒÐÏÓÅ: READ DATA FROM AN OPEN FILE ÁÒÇÓ : .Ø = ÆILE DESCRIPTOR NUMBER (ZP) = POINTER TO BUFFER TO STORE DATA INTO .ÁÙ = MAXIMUM NUMBER OF BYTES TO READ ÒÅÔÕÒÎÓ: (ZW) = .ÁÙ=NUMBER OF BYTES ACTUALLY READ IN .ÃÓ = ERROR OCCURRED FLAG .ÚÓ = ÅÏÆ REACHED FLAG ÁÌÔÅÒÓ : .Ø, ERRNO ÒEADS DATA FROM THE CURRENT POSITION OF AN OPEN FILE. ÕP TO THE SPECIFIED MAXIMUM NUMBER OF BYTES WILL BE READ. ÙOU SHOULD NOT GIVE A MAXIMUM OF ZERO BYTES, OR YOU MAY MISINTERPRET AN ÅÏÆ (END OF FILE). ÔHE BUFFER MUST BE AT LEAST THE SIZE OF THE MAXIMUM NUMBER OF BYTES TO READ. ÔHE DATA ARE NOT INTERPRETED IN ANY WAY, SO IT IS THE PROGRAMMER'S RESPONSIBILITY TO SEARCH FOR CARRIAGE RETURN CHARACTERS TO LOCATE LINES OF INPUT, IF HE SO DESIRES. ÈOWEVER, FOR THE CONSOLE THE INPUT IS NATURALLY DIVIDED UP INTO LINES, SO EACH CALL WILL RETURN AN ENTIRE LINE OF BYTES IF THE BUFFER IS LARGE ENOUGH. ÔHERE ARE NO GUARANTEES ABOUT THE NUMBER OF BYTES THAT WILL BE RETURNED, EXCEPT THAT IT WILL BE BETWEEN 1 AND THE BUFFER SIZE. ÓO, IF YOU WISH TO READ A CERTAIN NUMBER OF BYTES, YOU MAY HAVE TO MAKE MULTIPLE READ CALLS. ÔHE CALL RETURNS THE NUMBER OF BYTES READ IN BOTH THE .ÁÙ REGISTER PAIR AND IN (ZW), FOR ADDED CONVENIENCE. [ÎOTE: IN ÁÃÅ ÒELEASE #9, THE NUMBER OF BYTES READ ARE RETURNED ONLY IN THE .ÁÙ REGISTERS, NOT IN (ZW).] Á RETURN OF ZERO BYTES READ MEANS THAT THE END OF THE FILE HAS BEEN REACHED. ÁN ATTEMPT TO READ BEYOND THE END OF FILE WILL SIMPLY GIVE ANOTHER ÅÏÆ RETURN. ÅND OF FILE IS ALSO RETURNED IN THE .Ú FLAG OF THE PROCESSOR. ÎÁÍÅ : WRITE ÐÕÒÐÏÓÅ: WRITE DATA TO AN OPEN FILE ÁÒÇÓ : .Ø = FILE DESCRIPTOR NUMBER (ZP) = POINTER TO DATA TO BE WRITTEN .ÁÙ = LENGTH OF DATA TO BE WRITTEN IN BYTES ÒÅÔÕÒÎÓ: .ÃÓ = ERROR OCCURRED ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ×RITES DATA AT THE CURRENT POSITION OF AN OPEN FILE. [ÎOTE: ÁÃÅ ÒELEASE #9 ALSO ALTERS LOCATIONS (ZW) WHEN WRITING TO THE CONSOLE. ÔHIS PROBLEM WILL BE CORRECTED.] ÎÁÍÅ : FASTOPEN ÐÕÒÐÏÓÅ: OPEN A FILE FOR FAST READING ÁÒÇÓ : (ZP) = ÎAME .Á = FILE MODE (MUST BE "R") ÒÅÔÕÒÎÓ: .Á = FILE DESCRIPTOR NUMBER .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Ø, .Ù, ERRNO ÔHIS PERFORMS THE SAME FUNCTION AS THE REGULAR "OPEN" CALL, EXCEPT THIS STYLE OF FILE ACCESSING WILL ALLOW FILES TO BE READ MUCH FASTER THAN THE OTHER. ÏN DEVICES THAT ARE SO EQUIPPED, THE "FASTLOAD" BURST COMMAND IS USED (SIMILAR SHORTCUTS MAY BE POSSIBLE WITH OTHER DEVICES TOO). ÔHE DRAWBACK OF THIS INCREASED SPEED IS THAT NO OTHER DEVICE É/Ï CAN TAKE PLACE WHILE A FILE IS OPENED FOR "FAST" ACCESS, NOT EVEN TO OTHER DEVICES, EXCEPT FOR OUTPUT TO THE CONSOLE. ÏTHER FILES CAN BE OPEN, JUST NOT ACCESSED. ÙOU ALSO CANNOT OPEN MORE THAN ONE "FAST" FILE AT A TIME. ÉNTERRUPTS WILL BE DISABLED WHILE A FILE IS OPEN FOR FAST ACCESSING, SO THE USER CANNOT RE-ENABLE THEM, FOR TECHNICAL REASONS. ÔHE ARGUMENTS TO THIS CALL ARE EXACTLY THE SAME AS THE REGULAR "OPEN" TO MAKE IT EASY TO SWITCH FROM USING ONE TO THE OTHER. [ÎOTE: THESE "FAST" CALLS DO NOT EXIST IN ÒELEASE #9]. ÎÁÍÅ : FASTCLOSE ÐÕÒÐÏÓÅ: CLOSE THE FILE THAT WAS OPENED FOR FAST READING ÁÒÇÓ : .Á = ÆILE DESCRIPTOR NUMBER ÒÅÔÕÒÎÓ: .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÃLOSES THE FILE THAT WAS OPENED FOR FAST READING. ÎÁÍÅ : FASTREAD ÐÕÒÐÏÓÅ: READ DATA FROM THE FILE OPENED FOR FAST READING ÁÒÇÓ : .Ø = ÆILE DESCRIPTOR NUMBER (ZP) = POINTER TO BUFFER TO STORE DATA INTO .ÁÙ = MAXIMUM NUMBER OF BYTES TO READ ÒÅÔÕÒÎÓ: (ZW) = .ÁÙ=NUMBER OF BYTES ACTUALLY READ IN .ÃÓ = ERROR OCCURRED FLAG .ÚÓ = ÅÏÆ REACHED FLAG ÁÌÔÅÒÓ : .Ø, ERRNO ÒEAD DATA FROM THE (ONE) FILE THAT IS CURRENTLY OPENED FOR "FAST" READING. ÔHE ARGUMENTS AND SEMANTICS ARE EQUIVALENT TO THE REGULAR "READ" CALL. ÎÁÍÅ : BLOAD ÐÕÒÐÏÓÅ: BINARY LOAD ÁÒÇÓ : (ZP) = PATHNAME .ÁÙ = ADDRESS TO LOAD FILE (ZW) = HIGHEST ADDRESS THAT FILE MAY OCCUPY, PLUS ONE ÒÅÔÕÒÎÓ: .ÁÙ = END ADDRESS OF LOAD, PLUS ONE .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Ø, ERRNO ÂINARY-LOAD A FILE DIRECTLY INTO MEMORY. ÉF THE FILE WILL NOT FIT INTO THE SPECIFIED SPACE, AN ERROR WILL BE RETURNED AND THE LOAD TRUNCATED IF THE DEVICE SUPPORTS TRUNCATION; OTHERWISE, IMPORTANT DATA MAY BE OVERWRITTEN. ÎÁÍÅ : REMOVE ÐÕÒÐÏÓÅ: DELETE A FILE ÁÒÇÓ : (ZP) = PATHNAME ÒÅÔÕÒÎÓ: .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÄELETE THE NAMED FILE. ÎÁÍÅ : RENAME ÐÕÒÐÏÓÅ: RENAME A FILE OR DIRECTORY ÁÒÇÓ : (ZP) = OLD FILENAME (ZW) = NEW FILENAME ÒÅÔÕÒÎÓ: .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÒENAMES A FILE OR DIRECTORY. ÉF A FILE WITH THE NEW NAME ALREADY EXISTS, THEN THE OPERATION WILL BE ABORTED AND A "FILE EXISTS" ERROR WILL BE RETURNED. ÏN MOST DEVICES, THE FILE TO BE RENAMED MUST BE IN THE CURRENT DIRECTORY AND THE NEW NAME MAY NOT INCLUDE ANY PATH, JUST A FILENAME. ÎÁÍÅ : DEVINFO ÐÕÒÐÏÓÅ: GIVE INFORMATION ABOUT DEVICE ÁÒÇÓ : .Ø = FILE DESCRIPTOR NUMBER ÒÅÔÕÒÎÓ: .Á = DEVICE TYPE CODE .Ø = NUMBER OF COLUMNS ON DEVICE .Ù = NUMBER OF ROWS PER "PAGE" OF DEVICE .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : ERRNO ÔHIS CALL RETURNS INFORMATION ABOUT THE DEVICE OF AN OPEN FILE. ÔHERE ARE FOUR POSSIBLE VALUES FOR THE DEVICE TYPE CODE: 0==CONSOLE, 1==CHARACTER-ORIENTED DEVICE, AND 2==DISK DEVICE. ÔHE NUMBER OF ROWS AND COLUMNS PER "PAGE" OF THE DEVICE ARE ALSO RETURNED. ÆOR THE CONSOLE, THIS WILL BE THE CURRENT WINDOW SIZE. ÆOR A CHARACTER-ORIENTED DEVICE, IT WILL BE THE NATURAL SIZE (TYPICALLY 80 COLUMNS BY 66 ROWS), AND FOR A DISK, IT WILL BE 40 COLUMNS IN 64 MODE OR 80 COLUMNS IN 128 MODE, BOTH BY 66 ROWS. ÎÁÍÅ : FDSWAP ÐÕÒÐÏÓÅ: SWAP TWO FILE DESCRIPTOR NUMBERS ÁÒÇÓ : .Ø = FIRST FILE DESCRIPTOR NUMBER .Ù = SECOND FILE DESCRIPTOR NUMBER ÒÅÔÕÒÎÓ: .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÔHIS CALL SWAPS MEANINGS OF TWO FILE DESCRIPTOR NUMBERS. ÔHE FILE DESCRIPTORS MAY BE EITHER IN USE OR NOT USE WHEN THE CALL IS MADE. ÔHIS CALL IS INTENDED TO BE USED TO REDIRECT THE STDIN, STDOUT, AND STDERR FILE STREAMS. ÔO DO THIS, SIMPLY OPEN THE NEW FILE INTENDED TO BE, FOR EXAMPLE, STDOUT, AND SWAP THE FILE DESCRIPTOR NUMBER RETURNED FROM THE OPEN WITH FILE DESCRIPTOR NUMBER 1 (STDOUT). ÐOOF. ÔHEN CALL YOUR SUBROUTINE OR EXTERNAL PROGRAM, AND ON RETURN, SWAP THE TWO FILE DESCRIPTORS BACK, AND CLOSE THE REDIRECTION FILE. 2.2. ÄÉÒÅÃÔÏÒÙ ÃÁÌÌÓ ÎÁÍÅ : DIROPEN ÐÕÒÐÏÓÅ: OPEN A DIRECTORY FOR SCANNING ITS DIRECTORY ENTRIES ÁÒÇÓ : (ZP) = DIRECTORY PATHNAME ÒÅÔÕÒÎÓ: .Á = FILE DESCRIPTOR NUMBER .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Ø, .Ù, ERRNO ÔHIS CALL OPENS A DIRECTORY FOR READING ITS ENTRIES. ÉT RETURNS A "FILE" DESCRIPTOR NUMBER TO YOU TO USE FOR READING SUCCESSIVE DIRECTORY ENTIRES WITH THE "DIRREAD" CALL. ÔHE PATHNAME THAT YOU GIVE TO THIS CALL MUST BE A PROPER DIRECTORY NAME LIKE "A:" OR "C:2//C64/GAMES/:", ENDING WITH A COLON CHARACTER. ÙOU CAN HAVE DIRECTORIES FROM MULTIPLE DEVICES OPEN FOR READING AT ONE TIME, BUT YOU CANNOT HAVE THE DIRECTORY OF ONE DEVICE OPEN MULTIPLE TIMES. ÁLSO NOTE THAT YOU CANNOT PASS WILDCARDS TO THIS CALL; YOU WILL RECEIVE THE ENTIRE DIRECTORY LISTING. ÎÁÍÅ : DIRCLOSE ÐÕÒÐÏÓÅ: CLOSE A DIRECTORY OPENED FOR SCANNING ÁÒÇÓ : .Á = FILE DESCRIPTOR NUMBER ÒÅÔÕÒÎÓ: .ÃÓ = ERROR OCCURRED FLAG ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÃLOSES A DIRECTORY THAT IS OPEN FOR READING. ÙOU CAN MAKE THIS CALL AT ANY POINT WHILE SCANNING A DIRECTORY; YOU DO NOT HAVE TO FINISH SCANNING AN ENTIRE DIRECTORY FIRST. ÎÁÍÅ : DIRREAD ÐÕÒÐÏÓÅ: READ THE NEXT DIRECTORY ENTRY FROM AN OPEN DIRECTORY ÁÒÇÓ : .Ø = FILE DESCRIPTOR NUMBER ÒÅÔÕÒÎÓ: .Ú = END OF DIRECTORY FLAG .ÃÓ = ERROR OCCURRED FLAG ACEÄIRENTÂUFFER = NEW DIRECTORY ENTRY DATA ÁÌÔÅÒÓ : .Á, .Ø, .Ù, ERRNO ÒEADS THE NEXT DIRECTORY ENTRY FROM THE SPECIFIED OPEN DIRECTORY INTO THE SYSTEM INTERFACE GLOBAL VARIABLE "ACEÄIRENTÂUFFER" DESCRIBED EARLIER. ÁFTER OPENING A DIRECTORY FOR READING, THE FIRST TIME YOU CALL THIS ROUTINE, YOU WILL RECEIVE THE NAME OF THE DISK (OR DIRECTORY). ÔHE "ACEÄIRENTÎAMEÌEN" AND "ACEÄIRENTÎAME" FIELDS ARE THE ONLY ONES THAT